package com.atguigu.gmall.all.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.product.BaseCategoryView;
import com.atguigu.gmall.product.client.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author 李旭
 * @date 2021/11/22 11:24
 * @Description:
 *
 *   首页
 */
@Controller
public class IndexController {

    //https://www.gmall.com/

    @Autowired
    private ProductFeignClient productFeignClient;
    //首页
    @GetMapping("/")
    public String index(Model model){
        List<Map> list = getData();
        System.out.println(JSONObject.toJSONString(list));
        //回显数据
        model.addAttribute("list",list);
        return "index/index";
    }

    //抽取数据
    private List<Map> getData() {
        /**
         * 办法1： POJO : 自定义POJO  同学课下可以完成一波
         * 办法2： 无敌版对象 Map
         * 办法3： JSONObject  底层依然是map
            java代码的速度 远远大于 DB的速度    尽量多写Java代码  少写SQL语句
         */
        List<Map>  list = new ArrayList<>();
        //1:查询数据库
        List<BaseCategoryView> baseCategoryViewList = productFeignClient.getBaseCategoryViewList();
        //2:stream 流
        //Map1  K1:Long 一级分类ID   V1：List<BaseCategoryView> 长度 60  图书、音像、电子书刊
        //Map2  K2:Long 一级分类ID   V2：List<BaseCategoryView> 长度 25  手机
        Map<Long, List<BaseCategoryView>> listMapByCategory1Id = baseCategoryViewList.stream().
                collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
        int index = 1;//行号
        for (Map.Entry<Long, List<BaseCategoryView>> entryByCategory1Id : listMapByCategory1Id.entrySet()) {
            List<BaseCategoryView> valueByCategory1Id = entryByCategory1Id.getValue();
            //一级分类
            Map mapByCategory1Id = new HashMap();
            mapByCategory1Id.put("index",index++);
            mapByCategory1Id.put("categoryId",entryByCategory1Id.getKey());
            mapByCategory1Id.put("categoryName", valueByCategory1Id.get(0).getCategory1Name());
            //=====================================================================
            //二级分类的集合
            Map<Long, List<BaseCategoryView>> listMapByCategory2Id = valueByCategory1Id.stream().collect(
                    Collectors.groupingBy(BaseCategoryView::getCategory2Id));

            List<Map>  listByCategory2Id = new ArrayList<>();
            for (Map.Entry<Long, List<BaseCategoryView>> entryByCategory2Id :
                                   listMapByCategory2Id.entrySet()) {
                List<BaseCategoryView> valueByCategory2Id = entryByCategory2Id.getValue();
                Map mapByCategory2Id = new HashMap();
                mapByCategory2Id.put("categoryId",entryByCategory2Id.getKey());
                mapByCategory2Id.put("categoryName", valueByCategory2Id.get(0).getCategory2Name());
                //=====================================================================
                //三级分类集合  stream流 偷天换日
                List<Map> listByCategory3Id = valueByCategory2Id.stream().map(baseCategoryView -> {
                    Map map = new HashMap();
                    map.put("categoryId",baseCategoryView.getCategory3Id());
                    map.put("categoryName",baseCategoryView.getCategory3Name());
                    return map;
                }).collect(Collectors.toList());
                //二级分类 子集合
                mapByCategory2Id.put("categoryChild",listByCategory3Id);
                listByCategory2Id.add(mapByCategory2Id);
            }
            //一级分类 子集合
            mapByCategory1Id.put("categoryChild",listByCategory2Id);

            list.add(mapByCategory1Id);
        }
        return list;
    }


    //人为生成静态化页面  （静态化技术）
    // Thymeleaf
    //   1、页面标签   th:text..
    //   2、静态化技术   templateEngine   模板引擎
    @Autowired
    private TemplateEngine templateEngine;


    @GetMapping("/createHtml")
    @ResponseBody  //将Result对象转成JSON串 显示在页面上
    public Result createHtml(){

        //问题： 乱码
        //乱码：  读取的时候与 写入的时候的编码不一样
        /**
         * spring:
         *   thymeleaf:
         *     #模板的模式，支持 HTML, XML TEXT JAVASCRIPT
         *     mode: HTML5
         *     #编码 可不用配置
         *     encoding: UTF-8
         *     #开发配置为false,避免修改模板还要重启服务器
         *     cache: false
         *     #配置模板路径，默认是templates，可以不用配置
         *     prefix: classpath:/templates/
         */

        //输出流
        Writer out = null;
        try {
            // 模板（页面） + 数据  == 输出（静态化页面IO流写入到指定位置 Nginx映射位置）
            List<Map> list = getData();
            //数据
            Context context = new Context();
            context.setVariable("list",list);
            //写
           /* out = new OutputStreamWriter(new
                    FileOutputStream("D:\\temp\\index.html"),"UTF-8");*/
            out = new PrintWriter("D:\\temp\\index.html","UTF-8");
            //process : 处理 模板
            //参数1：模板路径
            //参数2：数据
            //参数3：输出流
            templateEngine.process("index/index",context,out);//模板是由此读取
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(out != null)
                   out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return Result.ok();
    }





}
